/**
  通过sigqueue发送信息到信号处理函数中去
  本程序用sigqueue不停的向自身发送信号,并且携带数据，
  数据被放到处理函数的第二个参数siginfo_t结构体中的si_ptr指针，当num<10时不再发。

 **/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void myhandler(int signo,siginfo_t *si,void *ucontext);
int main(){
	union sigval val;//定义一个携带数据的共用体
	struct sigaction oldact,act;
	act.sa_sigaction=myhandler;
	act.sa_flags=SA_SIGINFO;
	//表示使用sa_sigaction指示的函数，处理完恢复默认，不阻塞处理过程中到达下在被处理的信号
	//注册信号处理函数
	sigaction(SIGUSR1,&act,&oldact);

	char data[100];
	int num=0;

	while(num<10){
		sleep(2);
		printf("等待SIGUSR1信号的到来\n"); 
		sprintf(data,"%d",num++);
		val.sival_ptr=data;
		sigqueue(getpid(),SIGUSR1,val);//向本进程发送一个信号
	}

}

void myhandler(int signo,siginfo_t *si,void *ucontext){
	printf("已经收到SIGUSR1信号\n");
	printf("%s\n",(char*)(si->si_ptr));
}
